// #include<iostream>
// //第一开始没有理解友元类的原因：对this指针的理解不够充分
// //this指针的类型：当前类的类型
// //友元类
// //为什么需要友元类：
// using namespace std;
// class Date
// {
// public:
//     friend void f(Date& d);
//     friend ostream& operator<<(ostream& out,const Date& d);
//     friend istream& operator>>(istream& in,Date& d); 
//     //给构造函数的参数加上一个缺省值：其目的到底是什么？
//     //使代码更灵活，虽然给构造函数的参数加上缺省值，编译器是不会自动生成默认的构造函数
//     //但是对于Date d;
//     //这是成员变量会使用全部的缺省值
//     Date(int year = 2025,int month = 5,int day = 6)
//     :_year(year)
//     ,_month(month)
//     ,_day(day)
//     {}

//     // void operator<<(ostream& out)
//     // {
//     //     out << _year <<" "<< _month <<" "<<_day <<'\n';
//     // }
    
//     private:
//     int _year;
//     int _month;
//     int _day;
// };
// ostream& operator<<(ostream& out,const Date& d)
// {
//    out <<d._year<<" "<<d._month<<" "<<d._day<<'\n';
//    return out;
// }
// //cout是std命名空间中ostream类的全局对象

// // istream& operator>>(istream& in,const Date& d)
// // {
// //     //对于内置类型不用重载
// //     in >> d._year >>" " >> d._month >>" " >>d._day<<'\n';
// //     return in;
// // }

// //这里加引用的原因：可以减少拷贝 + 可以改变值 
// //istream 不加const的原因：你将d._year的值流给in
// //这样的化in 里面的值会发生改变
// istream& operator>>(istream& in,Date& d)
// {
//     //对于内置类型不用重载
//     in >> d._year >> d._month >>d._day;
//     return in;
// }

// int main()
// {
//     Date d;
//     Date d1(2025,5,1);
//     //cout << d;
//     //我们希望左操作数类型 是 ostream
//     //但在非静态成员函数中，第一个参数是隐含的this指针 -> 这个是改变不了的
//     //-> 想要改变这种情况，将<<重载写在类的外面 ->这样的话this指针就会消失
    
//     //d.operator<<(cout);
//     //d << cout; 
//     //这样虽然能够解决问题但是这样是会让代码的可读性变差
//     //cout << d;

//     //cout << d << d1;//上面的代码是不支持连续输出的

//     //不支持连续输出的原因：先执行 cout << d;
//     //返回值是：void 
//     return 0;
// }
// //对于你第一次写的那串代码，你可以这样理解
// //void f()
// // {
// //     _day = 10;
// //     cout << _day <<" ";
// // }
// // void f(Date& d)
// // {
// //     d._day = 10;
// //     cout <<d._day <<" ";
// // }
// // int main()
// // {
// //     //当类中有显示定义的构造函数的话，编译器就不会自动生成默认的构造函数
// //      Date d;
// //      f(d);
// //      return 0;
// // }

// //通过上面的代码：我们可以知道友元函数的作用突破访问限定符的限制


// //必须使用友元函数的情况
// //重载<<

// //通过重载<<,让我明白了
// //cout是ostream类的对象